package cn.org.xwb.main.aspect;

import cn.org.xwb.main.constants.ResponseConstant;
import cn.org.xwb.main.dto.ServerErrorRespResult;
import lombok.extern.log4j.Log4j2;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Pointcut;
import org.springframework.core.annotation.Order;
import org.springframework.stereotype.Component;

/**
 * 服务器异常捕获处理切面类
 */
@Aspect
@Order(1)
@Component
@Log4j2
public class ServerErrorAspect {

    @Pointcut("@annotation(cn.org.xwb.main.annotation.error.ServerErrorCatch)")
    private void pointcutByServerErrorCatch() {}

    /**
     * cn.org.xwb.main.controller 包下及其子包下的所有类的所有 public 方法
     */
    @Pointcut("execution(public * cn.org.xwb.main.controller..*.*(..))")
    private void pointcutControllerAllMethod() {}

    /**
     * 捕获服务器异常环绕通知
     *
     * @param proceedingJoinPoint 切点
     * @return 切点方法执行返回结果
     */
    @Around("pointcutControllerAllMethod()")
    public Object catchServerErrorAroundAdvice(ProceedingJoinPoint proceedingJoinPoint) {
        try {
            // 执行切点方法，并返回切点方法执行返回结果
            return proceedingJoinPoint.proceed();
        } catch (Throwable e) {
            // 发生异常响应服务器错误响应结果对象
            log.error("服务器发生错误，\n错误信息：{}，\nerror：{}", e.getMessage(), e);
            return ServerErrorRespResult.serverErrorRespResult(ResponseConstant.SERVER_ERROR);
        }
    }

}
